23206
23840
Jag har skrivit en funktion för att förhindra att ringa Bitmap.createBitmap () om det kommer att kasta en OutOfMemoryError: bitmappsstorleken överstiger VM-budgeten, men jag fungerar inte alltid, hur rättar jag det? Här är ett exempel där det returnerar true istället för false:
if (isSufficientRAM (bredd * höjd)) {
Bitmap bmp = Bitmap.createBitmap (bredd, höjd, Bitmap.Config.ARGB_8888);
...
}
offentlig statisk boolesk isSufficientRAM (int längd) {
int minRamAfter = 1024 * 1024; // 1048576 byte (lämna alltid minst 1 MB ledigt)
lång imgSize = längd * 4; // det här är 31961088 byte i det här fallet, eftersom det är en 3264 x 2448 argb-bild
lång freeRAM = Runtime.getRuntime (). freeMemory (); // det här var 34415992 byte när jag kör det
boolean hasRAM = freeRAM> imgSize + minRamAfter; // detta är sant eftersom freeMemory () visar tillräckligt med RAM-minne tillgängligt
retur hasRAM;
}
När jag kör det här kommer funktionen att återgå till sant och Bitmap.createBitmap () ger felet nedan. Vad saknar jag i min isSufficientRAM () -funktion?
11-15 09: 01: 47.965: minRamAfter = 1048576
11-15 09: 01: 47.965: imgSize = 31961088
11-15 09: 01: 47.970: freeRAM = 34415992
11-15 09: 01: 48.020: hasRAM = true
11-15 09: 01: 48.060: D / dalvikvm (2538): GC_EXTERNAL_ALLOC frigjord 79K, 92% fri 3850K / 44679K, extern 2343K / 3018K, pausad 37ms
11-15 09: 01: 48.080: E / dalvikvm-heap (2538): 31961088-byte extern tilldelning för stor för denna process.
11-15 09: 01: 48.115: E / GraphicsJNI (2538): VM låter oss inte tilldela 31961088 byte
11-15 09: 01: 48.115: D / dalvikvm (2538): GC_FOR_MALLOC frigjord 0K, 92% ledig 3850K / 44679K, extern 2343K / 3018K, pausad 22ms
11-15 09: 01: 48.115: W / dalvikvm (2538): threadid = 12: tråd går ut med undantaget undantag (grupp = 0x4001e578)
11-15 09: 01: 48.115: E / AndroidRuntime (2538): FATAL EXCEPTION: Test thread name
11-15 09: 01: 48.115: E / AndroidRuntime (2538): java.lang.OutOfMemoryError: bitmappsstorlek överstiger VM-budget
11-15 09: 01: 48.115: E / AndroidRuntime (2538): vid android.graphics.Bitmap.nativeCreate (Native Method)
11-15 09: 01: 48.115: E / AndroidRuntime (2538): på android.graphics.Bitmap.createBitmap (Bitmap.java:477) 
".discard-answer"
, direktShowMarkdownHelp: true, enableTables: true, enableSnippets: true
});
}
});
Tack för att du bidrog med ett svar till Stack Overflow!
Var noga med att svara på frågan. Ge detaljer och dela din forskning!
Men undvik ...
Be om hjälp, förtydligande eller svara på andra svar.
Att göra uttalanden baserade på åsikt; säkerhetskopiera dem med referenser eller personlig erfarenhet.
För att lära dig mer, se våra tips för att skriva bra svar.
Utkast sparat
Utkast kasseras
Registrera dig eller logga in
StackExchange.ready (funktion () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Registrera dig med Google
Registrera dig med Facebook
Registrera dig med e-post och lösenord
Skicka in
Lägg upp som gäst
namn
E-post
Obligatoriskt men aldrig visat
StackExchange.ready (
funktion () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f13393264% 2fgetruntime-freememory-available-but-still-vm-wont-let-us-allocate- 31961088% 23nytt svar ',' fråga_sida ');
}
);
Lägg upp som gäst
namn
E-post
Obligatoriskt men aldrig visat
Lägg upp ditt svar
Kassera
Genom att klicka på “Lägg upp ditt svar” godkänner du våra användarvillkor, sekretesspolicy och cookiepolicy
Bläddra bland andra frågor taggade Android-minne eller ställ din egen fråga.